--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit cec903a4dcc878f14f8cd8be6a9abc54868cbea6
Parents : 962d9c9
Author : Mark Qvist <mark@unsigned.io>
Date : 2025-01-24T14:05:12+01:00
Added status query API function
Changes
3 files changed, 37 insertions(+), 25 deletions(-)
Diff
diff --git a/LXMF/Handlers.py b/LXMF/Handlers.py
index ea8960d..26a5df6 100644
--- a/LXMF/Handlers.py
+++ b/LXMF/Handlers.py
@@ -45,6 +45,7 @@ class LXMFPropagationAnnounceHandler:
if pn_announce_data_is_valid(data):
node_timebase = data[1]
propagation_transfer_limit = None
+ wanted_inbound_peers = None
if len(data) >= 4:
try:
wanted_inbound_peers = int(data[3])
diff --git a/LXMF/LXMPeer.py b/LXMF/LXMPeer.py
index 61602c3..5036528 100644
--- a/LXMF/LXMPeer.py
+++ b/LXMF/LXMPeer.py
@@ -20,6 +20,7 @@ class LXMPeer:
ERROR_NO_IDENTITY = 0xf0
ERROR_NO_ACCESS = 0xf1
+ ERROR_TIMEOUT = 0xfe
# Maximum amount of time a peer can
# be unreachable before it is removed
diff --git a/LXMF/Utilities/lxmd.py b/LXMF/Utilities/lxmd.py
index 7f54835..a06d60c 100644
--- a/LXMF/Utilities/lxmd.py
+++ b/LXMF/Utilities/lxmd.py
@@ -416,6 +416,36 @@ def deferred_start_jobs():
last_node_announce = time.time()
threading.Thread(target=jobs, daemon=True).start()
+def query_status(identity, timeout=5, exit_on_fail=False):
+ control_destination = RNS.Destination(identity, RNS.Destination.OUT, RNS.Destination.SINGLE, APP_NAME, "propagation", "control")
+
+ timeout = time.time()+timeout
+ def check_timeout():
+ if time.time() > timeout:
+ RNS.log("Getting lxmd statistics timed out, exiting now", RNS.LOG_ERROR)
+ if exit_on_fail:
+ exit(200)
+ else:
+ return LXMF.LXMPeer.LXMPeer.ERROR_TIMEOUT
+ else:
+ time.sleep(0.1)
+
+ if not RNS.Transport.has_path(control_destination.hash):
+ RNS.Transport.request_path(control_destination.hash)
+ while not RNS.Transport.has_path(control_destination.hash):
+ check_timeout()
+
+ link = RNS.Link(control_destination)
+ while not link.status == RNS.Link.ACTIVE:
+ check_timeout()
+
+ link.identify(identity)
+ request_receipt = link.request(LXMF.LXMRouter.STATS_GET_PATH, data=None, response_callback=None, failed_callback=None)
+ while not request_receipt.get_status() == RNS.RequestReceipt.READY:
+ check_timeout()
+
+ return request_receipt.get_response()
+
def get_status(configdir = None, rnsconfigdir = None, verbosity = 0, quietness = 0, timeout=5, show_status=False, show_peers=False, identity_path=None):
global configpath, identitypath, storagedir, lxmdir
global lxmd_config, active_configuration, targetloglevel
@@ -462,31 +492,8 @@ def get_status(configdir = None, rnsconfigdir = None, verbosity = 0, quietness =
targetloglevel = targetloglevel+verbosity-quietness
reticulum = RNS.Reticulum(configdir=rnsconfigdir, loglevel=targetloglevel, logdest=targetlogdest)
- control_destination = RNS.Destination(identity, RNS.Destination.OUT, RNS.Destination.SINGLE, APP_NAME, "propagation", "control")
-
- timeout = time.time()+timeout
- def check_timeout():
- if time.time() > timeout:
- RNS.log("Getting lxmd statistics timed out, exiting now", RNS.LOG_ERROR)
- exit(200)
- else:
- time.sleep(0.1)
-
- if not RNS.Transport.has_path(control_destination.hash):
- RNS.Transport.request_path(control_destination.hash)
- while not RNS.Transport.has_path(control_destination.hash):
- check_timeout()
-
- link = RNS.Link(control_destination)
- while not link.status == RNS.Link.ACTIVE:
- check_timeout()
-
- link.identify(identity)
- request_receipt = link.request(LXMF.LXMRouter.STATS_GET_PATH, data=None, response_callback=None, failed_callback=None)
- while not request_receipt.get_status() == RNS.RequestReceipt.READY:
- check_timeout()
+ response = query_status(identity, timeout=timeout, exit_on_fail=True)
- response = request_receipt.get_response()
if response == LXMF.LXMPeer.LXMPeer.ERROR_NO_IDENTITY:
RNS.log("Remote received no identity")
exit(203)
@@ -550,6 +557,9 @@ def get_status(configdir = None, rnsconfigdir = None, verbosity = 0, quietness =
print(f"")
if show_peers:
+ if not show_status:
+ print("")
+
for peer_id in s["peers"]:
ind = " "
p = s["peers"][peer_id]
@@ -562,7 +572,7 @@ def get_status(configdir = None, rnsconfigdir = None, verbosity = 0, quietness =
a = "Available" if p["alive"] == True else "Unreachable"
h = max(time.time()-p["last_heard"], 0)
hops = p["network_distance"]
- hs = f"{hops} hop away" if hops == 1 else f"{hops} hops away"
+ hs = "hops unknown" if hops == RNS.Transport.PATHFINDER_M else f"{hops} hop away" if hops == 1 else f"{hops} hops away"
pm = p["messages"]
if p["last_sync_attempt"] != 0:
lsa = p["last_sync_attempt"]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────